#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "login.h"
#include <QCamera>
#include <QDebug>

QString t1;

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    t1 = QString("");

    connect(ui->BTc1,SIGNAL(clicked()),this,SLOT(table()));
    connect(ui->BTc2,SIGNAL(clicked()),this,SLOT(table()));
    connect(ui->BTc3,SIGNAL(clicked()),this,SLOT(table()));
    connect(ui->BTc4,SIGNAL(clicked()),this,SLOT(table()));
    connect(ui->BTc5,SIGNAL(clicked()),this,SLOT(table()));
    connect(ui->BTc6,SIGNAL(clicked()),this,SLOT(table()));
    connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(get_result()));

    //初始化QNetworkAccessManager对象
    manager2=new QNetworkAccessManager(this);

    connect(manager2,SIGNAL(finished(QNetworkReply *)),this,SLOT(fun(QNetworkReply *)));

    //=================天气Jason====================
    //初始化QNetworkAccessManager对象
    manager1=new QNetworkAccessManager(this);

    //关联finished信号，在槽函数里面读取服务器的应答信息
    connect(manager1,SIGNAL(finished(QNetworkReply *)),this,SLOT(weast(QNetworkReply *)));

    //==============定时器=================
    //初始化定时器
    timer1=new QTimer(this);
    timer2=new QTimer(this);
    timer3=new QTimer(this);

    //定时时间设置
    timer1->setInterval(1000); //1秒钟
    timer2->setInterval(3000); //3秒钟
    timer3->setInterval(3000); //3秒钟
    //关联timeout信号
    connect(timer1,SIGNAL(timeout()),this,SLOT(on_pushButton_5_clicked()));
    connect(timer1,SIGNAL(timeout()),this,SLOT(MainWindow::weast(QNetworkReply *reply)));

    connect(timer2,SIGNAL(timeout()),this,SLOT(on_btcam_clicked()));
    connect(timer3,SIGNAL(timeout()),this,SLOT(get_carside()));
    //启动定时器
    timer1->start();
    timer2->start();
    timer3->start();

    //========================摄像头===========================
    //获取当前系统所有可以使用的摄像头信息
    auto cameralist=QCameraInfo::availableCameras();
    //遍历容器打印所有的摄像头信息
    for(auto it:cameralist)
    {
        qDebug()<<"摄像头的描述信息是: "<<it.description();
        qDebug()<<"摄像头的设备名称是: "<<it.deviceName();
        //把摄像头的设备名字在下拉框中显示出来
        ui->comboBox->addItem(it.deviceName()); 
    }
    //获取下拉框中你选择的摄像头设备名字
    QString str=ui->comboBox->currentText();

    //创建摄像头对象
    camera=new QCamera(str.toUtf8());

    //准备窗口用于摄像头画面显示
    QVideoWidget *win=new QVideoWidget(ui->widget);

    //调整窗口大小
    win->resize(ui->widget->width(),ui->widget->height());

    //窗口跟摄像头绑定
    camera->setViewfinder(win);

    //窗口显示
    win->show();

    //启动摄像头
    camera->start();

    //============================数据库sqlite3==============================
    base1=QSqlDatabase::addDatabase("QSQLITE","hello");
    //设置数据库的路径名
    base1.setDatabaseName("C:/嵌入式/c语言练习/.vscode/sqlite-autoconf-3470000/sqlite-autoconf-3470000/1.db");


    //打开数据库
    bool ret=base1.open();
    if(!ret)
    {
        qDebug()<<"打开数据库失败了,失败的原因: "<<base1.lastError().text();
        return;
    }

    //新建一个表格
    QSqlQuery query(base1);
    ret=query.exec("create table if not exists parksystem (num unique,time text,price text,side text);");
    if(!ret)
    {
        qDebug()<<"新建停车表格失败了,失败的原因: "<<query.lastError().text();
        return;
    }


}

MainWindow::~MainWindow()
{
    timer1->stop();
    timer2->stop();
    timer3->stop();

    //关闭摄像头
    camera->stop();
    base1.close();

    delete ui;
}

void MainWindow::on_pushButton_4_clicked()
{
    //跳到下一个界面--》主界面
    //新建主界面对象,此时必须把this指针当成参数传递给第二个界面(方便返回)
  login * win=new login(this);
  //显示主界面
  win->show();
  //隐藏当前界面(隐藏表示把界面转入系统后台，偷偷摸摸运行，肉眼不可见)
  this->hide();
}


void MainWindow::on_pushButton_5_clicked()
{
   //
    //获取系统的日期
    QDate mydate=QDate::currentDate();

    //获取系统的时间
    QTime mytime=QTime::currentTime();

    //转换函数，可以把时间转换成字符串格式显示
    QString timestr=mytime.toString("hh:mm:ss");

    //转换函数，可以把日期转换成字符串格式显示
    QString datestr=mydate.toString("yyyy-MM-dd");
    //在液晶数字上显示时间
    ui->lcdNumber_2->display(datestr);
    ui->lcdNumber->display(timestr);

    //获取天气预报的网址
    QString str=("http://t.weather.itboy.net/api/weather/city/101010100");
    //构建QUrl对象
    QUrl url(str);
    //创建http请求对象
    QNetworkRequest request(url);
    //发送刚才的请求
    manager1->get(request);

    QCameraImageCapture *mycapture=new QCameraImageCapture(camera,this);
    //关联imageCaptured(int id, const QImage &preview)信号
//    connect(mycapture,SIGNAL(imageCaptured(int, QImage)),this,SLOT(fun(QNetworkReply *reply,int id,QImage img)));
    //捕捉画面
    mycapture->capture("E:/QTT/PRO4/catch/1.jpg");
}

void MainWindow::weast(QNetworkReply *reply)
{
    //读取服务器的应答信息
    QByteArray buf=reply->readAll();
    //由于我这个例子是从网上获取天气预报信息，因此buf里面的数据就是天气预报信息

    //第一步：把json数据规格化存储
    QJsonDocument doc=QJsonDocument::fromJson(buf);

    //第二步：依据你肉眼看到的json格式，一步步解析
    //获取最外层的对象
    QJsonObject obj1=doc.object();
    //获取键对应的值，获取"cityInfo"这个键对应的值(是个对象)
    QJsonValue val1=obj1.value("cityInfo");
    //观察发现val1是个对象，因此调用QJsonValue类里面toObject方法转换成对象
    QJsonObject obj2=val1.toObject();
    //获取obj2里面的，键city对应的值
    QJsonValue val2=obj2.value("city");
    ui->label_3->setText(val2.toString());

    //获取数据对象
    QJsonObject obj3=doc.object();
    QJsonValue val3=obj3.value("data");
    //观察发现val3是个对象，因此调用QJsonValue类里面toObject方法转换成对象
    QJsonObject obj4=val3.toObject();
    //获取obj2里面的，键city对应的值
    QJsonValue val4=obj4.value("wendu");
    ui->label_4->setText(val4.toString());


}

//如果画面保存成功，会自动调用该槽函数
void MainWindow::fun(QNetworkReply *reply)
{

    //读取服务器的应答信息
    QByteArray buf=reply->readAll();
    //由于我这个例子是从网上获取天气预报信息，因此buf里面的数据就是天气预报信息

    //第一步：把json数据规格化存储
    QJsonDocument doc=QJsonDocument::fromJson(buf);

    //第二步：依据你肉眼看到的json格式，一步步解析
    //获取最外层的对象
    QJsonObject obj1=doc.object();
    //获取键对应的值，获取"plates"这个键对应的值(是个对象)
    QJsonValue val1=obj1.value("plates");
    //观察发现val1是个对象，因此调用QJsonValue类里面toObject方法转换成对象
    QJsonArray array1=val1.toArray();
    //获取obj2里面的，键txt对应的值
    QJsonObject obj2=array1.at(0).toObject();

    //获取键对应的值，获取"plates"这个键对应的值(是个对象)
    QJsonValue txt=obj2.value("txt");
    t1 =txt.toString();

    ui->label_8->setText(t1);

}

void MainWindow::on_btcam_clicked()
{
    //准备请求
    QImage myImage("E:/QTT/PRO4/catch/1.jpg");
    QByteArray byteAr;
    QBuffer buf(&byteAr);
    myImage.save(&buf,"JPG");

    //设置域名以及api
    QUrl myUrl("http://ocrcp.market.alicloudapi.com/rest/160601/ocr/ocr_vehicle_plate.json");
    QNetworkRequest myRequest(myUrl);
    QString appCode="APPCODE cae1e8b940354229a815a6c58b9a40fc";
    QString host="ocrcp.market.alicloudapi.com";
    myRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
    myRequest.setRawHeader("Authorization",appCode.toLocal8Bit());
    myRequest.setRawHeader("Host",host.toLocal8Bit());

    //将JSON数据转为base64格式
    QJsonObject jsonObj;
    jsonObj.insert("image",byteAr.toBase64().data());
    jsonObj.insert("configure","{\"multi_crop\":true}");
    QJsonDocument jsonDoc = QJsonDocument(jsonObj);
    QByteArray post_data = jsonDoc.toJson(QJsonDocument::Compact);
    manager2->post(myRequest,post_data);
}

void MainWindow::table()
{
        QSqlQuery query(base1); // 重用查询对象
        QString cmd = QString("select * from parksystem where num='%1'").arg(t1);
        if (!query.exec(cmd))
        {
            qDebug() << "查询失败,原因是:" << query.lastError().text();
            return;
        }

        if (!query.next())
            {
                    // 插入新记录的逻辑
                    QPushButton *clickedButton = qobject_cast<QPushButton*>(sender());
                    if (clickedButton && !t1.isEmpty())
                    {
                        QSqlQuery query1(base1); // 重用查询对象
                        QString timeString = QTime::currentTime().toString("hh:mm:ss");
                        QString side = clickedButton->text().replace("车位", "");
                        QString insertCmd = QString("insert into parksystem (num, time, price, side) values ('%1', '%2', '0', '%3')").arg(t1).arg(timeString).arg(side);
                        if (!query1.exec(insertCmd))
                            {
                                qDebug() << "插入停车信息失败,原因是:" << query1.lastError().text();
                            }
                        else
                            {
                                t1.clear();
                                clickedButton->setStyleSheet("background-color: red; border:3px solid #000000; border-radius:20px;");
                            }
                    }
            }



}

void MainWindow::get_result()
{

    QSqlQuery query(base1); // 重用查询对象
    QString cmd = QString("select * from parksystem where num='%1'").arg(t1);
    if (!query.exec(cmd))
    {
        qDebug() << "查询失败,原因是:" << query.lastError().text();
        return;
    }

    if(query.next())
    {
        QString time1 = query.value(1).toString(); // 假设时间是第二列
        QTime starttime = QTime::fromString(time1, "hh:mm:ss");
        if (!starttime.isValid())
        {
            qDebug() << "时间格式错误";
            return;
        }

        QTime endtime = QTime::currentTime();
        int time_result = starttime.msecsTo(endtime);
        int minutes = time_result / 1000; // 将毫秒转换为分钟
        int price = minutes * 2; // 假设每分钟2元
        QString price1 = QString::number(price);
        qDebug()<<111<<endl;


        ui->label_9->setText(price1);

        QString updateCmd = QString("update parksystem set price='%1' where num='%2'").arg(price1).arg(t1);
        QSqlQuery query2(base1); // 重用查询对象
        if (!query2.exec(updateCmd))
        {
            qDebug() << "更新车费失败,原因是:" << query2.lastError().text();
        }

        //拼接得到删除语句
        bool ret2;
        QString cmd=QString("delete from parksystem where num='%1';").arg(t1);
        QSqlQuery query3(base1);
        ret2=query3.exec(cmd);
        if(!ret2)
        {
            qDebug()<<"删除停车信息失败了,失败的原因: "<<query3.lastError().text();
            return;
        }
    }

}

void MainWindow::get_carside()
{
    qDebug()<<111<<endl;
    QSqlQuery query(base1); // 重用查询对象
    QString cmd = QString("select * from parksystem");
    if (!query.exec(cmd))
    {
        qDebug() << "查询失败,原因是:" << query.lastError().text();
        return;
    }
    else
    {
        while(query.next())
        {
            QString side = query.value(3).toString();

            if(side == "1")
            {
                ui->BTc1->setStyleSheet("background-color: red; border:3px solid #000000; border-radius:20px;");
            }
            else if(side == "2")
            {
                ui->BTc2->setStyleSheet("background-color: red; border:3px solid #000000; border-radius:20px;");
            }
            else if(side == "3")
            {
                ui->BTc3->setStyleSheet("background-color: red; border:3px solid #000000; border-radius:20px;");
            }
            else if(side == "4")
            {
                ui->BTc4->setStyleSheet("background-color: red; border:3px solid #000000; border-radius:20px;");
            }
            else if(side == "5")
            {
                ui->BTc5->setStyleSheet("background-color: red; border:3px solid #000000; border-radius:20px;");
            }
            else if(side == "6")
            {
                ui->BTc6->setStyleSheet("background-color: red; border:3px solid #000000; border-radius:20px;");
            }

        }
    }
}

void MainWindow::on_BTc1_clicked()
{
}

void MainWindow::on_BTc2_clicked()
{
}

void MainWindow::on_BTc3_clicked()
{
}

void MainWindow::on_BTc4_clicked()
{
}

void MainWindow::on_BTc5_clicked()
{
}

void MainWindow::on_BTc6_clicked()
{

}

void MainWindow::on_pushButton_clicked()
{
}
